var config = require('../config/config').config;
var util = require('./util');
var httpHandle = util.httpHandle;
var EventProxy = require('eventproxy');
var min = require('min');
var cache = require('memory-cache');

/**
 * 初始化微信服务
 * args
 **/
var weixin = require('node-weixin').init({
    token: config.weixin.token,
    appid: config.weixin.appID,
    secret: config.weixin.appsecret
});

weixin.errMsg(function(err) {
    console.log(err);
});

// ===============================
// ===========接收消息============
// ===============================
/**
 * 监听文本消息
 */
weixin.textMsg(function(msg) {
    weixin.postMsg({
        FromUserName: msg.ToUserName,
        ToUserName: msg.FromUserName,
        CreateTime: new Date().getTime(),
        MsgType: 'text',
        Content: 'Hello, World!' //文本内容
    });
    console.log(msg);
});

/**
 * 监听图片消息
 */
weixin.imageMsg(function(msg) {
    weixin.postMsg({
        FromUserName: msg.ToUserName,
        ToUserName: msg.FromUserName,
        CreateTime: new Date().getTime(),
        MsgType: 'image',
        MediaId: msg.MediaId
    });
    console.log(msg);
});

/**
 * 监听语音消息
 */
weixin.voiceMsg(function(msg) {
    weixin.postMsg({
        FromUserName: msg.ToUserName,
        ToUserName: msg.FromUserName,
        CreateTime: new Date().getTime(),
        MsgType: 'voice',
        MediaId: msg.MediaId
    });
    console.log(msg);
});

/**
 * 监听视频消息
 */
weixin.videoMsg(function(msg) {
    weixin.postMsg({
        FromUserName: msg.ToUserName,
        ToUserName: msg.FromUserName,
        CreateTime: new Date().getTime(),
        MsgType: 'video',
        MediaId: msg.MediaId,
        ThumbMediaId: msg.ThumbMediaId
    });
    console.log(msg);
});

/**
 * 监听上报地理位置消息
 */
weixin.locationMsg(function(msg) {
    weixin.postMsg({
        FromUserName: msg.ToUserName,
        ToUserName: msg.FromUserName,
        CreateTime: new Date().getTime(),
        MsgType: 'music',
        Title: '果果的原创音乐',
        Description: '果果的原创音乐介绍',
        MusicUrl: 'http://qiniu.tuhuangzhe.com/audio/%E7%9B%B8%E6%80%9D%E5%90%9F2.wav?avthumb/mp3/ab/192k',
        HQMusicUrl: 'http://qiniu.tuhuangzhe.com/audio/%E7%9B%B8%E6%80%9D%E5%90%9F2.wav?avthumb/mp3/ab/250k',
        ThumbMediaId: ThumbMediaId //要使用自己上传的一张图的MediaId
    });
    console.log(msg);
});

/**
 * 监听链接消息
 */
weixin.linkMsg(function(msg) {
    weixin.postMsg({
        FromUserName: msg.ToUserName,
        ToUserName: msg.FromUserName,
        CreateTime: new Date().getTime(),
        MsgType: 'news',
        Articles: [{
            Title: 'aa',
            Description: 'bb',
            PicUrl: 'http://feeloc08.u.qiniudn.com/1385473580021/1385473580021.jpg?imageView/2/w/320',
            Url: 'http://blog.feeloc.cn'
        }, {
            Title: 'aa',
            Description: 'bb',
            PicUrl: 'http://feeloc08.u.qiniudn.com/1385473580021/1385473580021.jpg?imageView/2/w/320',
            Url: 'http://blog.feeloc.cn'
        }]
    });
    console.log(msg);
});

/**
 * 点击关注
 */
weixin.subEventMsg(function(msg) {
    console.log(msg);
});

/**
 * 取消关注
 */
weixin.unsubEventMsg(function(msg) {
    console.log(msg);
});

/**
 * 扫自定义二维码
 */
weixin.scanEventMsg(function(msg) {
    console.log(msg);
});

/**
 * 进入会话
 */
weixin.enterEventMsg(function(msg) {
    console.log(msg);
});

/**
 * 上报地理位置
 */
weixin.locationEventMsg(function(msg) {
    console.log(msg);
});

/**
 * 点击自定义菜单事件
 */
weixin.clickEventMsg(function(msg) {
    console.log(msg);
});



// ===============================
// ========微信全局返回码说明=====
// ===============================
var errcode = {
    '-1': '系统繁忙',
    '0': '请求成功',
    '40001': '获取access_token时AppSecret错误，或者access_token无效',
    '40002': '不合法的凭证类型',
    '40003': '不合法的OpenID',
    '40004': '不合法的媒体文件类型',
    '40005': '不合法的文件类型',
    '40006': '不合法的文件大小',
    '40007': '不合法的媒体文件id',
    '40008': '不合法的消息类型',
    '40009': '不合法的图片文件大小',
    '40010': '不合法的语音文件大小',
    '40011': '不合法的视频文件大小',
    '40012': '不合法的缩略图文件大小',
    '40013': '不合法的APPID',
    '40014': '不合法的access_token',
    '40015': '不合法的菜单类型',
    '40016': '不合法的按钮个数',
    '40017': '不合法的按钮个数',
    '40018': '不合法的按钮名字长度',
    '40019': '不合法的按钮KEY长度',
    '40020': '不合法的按钮URL长度',
    '40021': '不合法的菜单版本号',
    '40022': '不合法的子菜单级数',
    '40023': '不合法的子菜单按钮个数',
    '40024': '不合法的子菜单按钮类型',
    '40025': '不合法的子菜单按钮名字长度',
    '40026': '不合法的子菜单按钮KEY长度',
    '40027': '不合法的子菜单按钮URL长度',
    '40028': '不合法的自定义菜单使用用户',
    '40029': '不合法的oauth_code',
    '40030': '不合法的refresh_token',
    '40031': '不合法的openid列表',
    '40032': '不合法的openid列表长度',
    '40033': '不合法的请求字符，不能包含\\uxxxx格式的字符',
    '40035': '不合法的参数',
    '40038': '不合法的请求格式',
    '40039': '不合法的URL长度',
    '40050': '不合法的分组id',
    '40051': '分组名字不合法',
    '41001': '缺少access_token参数',
    '41002': '缺少appid参数',
    '41003': '缺少refresh_token参数',
    '41004': '缺少secret参数',
    '41005': '缺少多媒体文件数据',
    '41006': '缺少media_id参数',
    '41007': '缺少子菜单数据',
    '41008': '缺少oauth code',
    '41009': '缺少openid',
    '42001': 'access_token超时',
    '42002': 'refresh_token超时',
    '42003': 'oauth_code超时',
    '43001': '需要GET请求',
    '43002': '需要POST请求',
    '43003': '需要HTTPS请求',
    '43004': '需要接收者关注',
    '43005': '需要好友关系',
    '44001': '多媒体文件为空',
    '44002': 'POST的数据包为空',
    '44003': '图文消息内容为空',
    '44004': '文本消息内容为空',
    '45001': '多媒体文件大小超过限制',
    '45002': '消息内容超过限制',
    '45003': '标题字段超过限制',
    '45004': '描述字段超过限制',
    '45005': '链接字段超过限制',
    '45006': '图片链接字段超过限制',
    '45007': '语音播放时间超过限制',
    '45008': '图文消息超过限制',
    '45009': '接口调用超过限制',
    '45010': '创建菜单个数超过限制',
    '45015': '回复时间超过限制',
    '45016': '系统分组，不允许修改',
    '45017': '分组名字过长',
    '45018': '分组数量超过上限',
    '46001': '不存在媒体数据',
    '46002': '不存在的菜单版本',
    '46003': '不存在的菜单数据',
    '46004': '不存在的用户',
    '47001': '解析JSON/XML内容错误',
    '48001': 'api功能未授权',
    '50001': '用户未授权该api'
};

/**
 * 处理微信响应代码
 * 
 **/
exports.processMsg = function(msg){
    var msgObj = JSON.parse(msg);
    if(msgObj.errcode && msgObj.errcode !== 0){
        return errcode[msgObj.errcode];
    }
}

// ===============================
// ===========发送消息============
// ===============================

/**
 * 获取accessToken
 *
 * callback: fun(err, token)
 **/
exports.getAccessTokenFromCache = function(callback) {
    // min.get('access_token', function(err, value) {
    //     if (err || value) {
    //         weixin.getAccessToken(function(r) {
    //             var token = JSON.parse(r);
    //             min.psetex('access_token', (token.expires_in - 60) * 1000, token.access_token, function(err){
    //                 callback(err);
    //             });
    //             callback(null, token.access_token);
    //         });
    //     } else {
    //         callback(null, value);
    //     }
    // });

    var accessToken = cache.get('access_token');
    if (accessToken) {
        callback(null, accessToken);
    } else {
        var proxy = EventProxy.create('token',
            function(token) {
                var token = JSON.parse(token);
                cache.put('access_token', token.access_token, (token.expires_in - 60) * 1000);
                callback(null, token.access_token);
            });

        weixin.getAccessToken(function(r) {
            proxy.emit('token', r);
        });
    }
}

// ===============================
// ==========扩展微信API==========
// ===============================

var uploadMediaUrl = 'http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token={ACCESS_TOKEN}&type={TYPE}';
var createUserGroupUrl = 'https://api.weixin.qq.com/cgi-bin/groups/create?access_token={ACCESS_TOKEN}';
var userGroupListUrl = 'https://api.weixin.qq.com/cgi-bin/groups/get?access_token={ACCESS_TOKEN}';
var getUserGroupUrl = 'https://api.weixin.qq.com/cgi-bin/groups/getid?access_token={ACCESS_TOKEN}';


/**
 * 上传多媒体文件
 *
 * @param {string}    accessToken 调用接口凭证
 * @param {string}    type
 *                    媒体文件类型，分别有图片（image）、语音（voice）、视频（video）和缩略图（thumb）
 * @param {Object}    data 文件封装信息
 * @param {function}  callback
 * @returns void
 * @date
 * @author
 **/
exports.uploadMedia = function(accessToken, type, data, callback) {
    var url = uploadMediaUrl.replace('{ACCESS_TOKEN}', accessToken).replace('{TYPE}', type);
    httpHandle(url, 'POST', {}, data, function(r) {
        if (callback) {
            callback(r);
        }
    });
};


/**
 * 创建分组
 *
 * @param {string}    accessToken 调用接口凭证
 * @param {Object}    data 分组数据封装
 * @param {function}  callback
 * @returns void
 * @date
 * @author
 **/
exports.createUserGroup = function(accessToken, data, callback) {
    var url = createUserGroupUrl.replace('{ACCESS_TOKEN}', accessToken);
    httpHandle(url, 'POST', {}, data, function(r) {
        if (callback) {
            callback(r);
        }
    });
};

/**
 * 查询分组
 *
 * @param {string}    accessToken 调用接口凭证
 * @param {function}  callback err,data
 * @returns void
 * @date
 * @author
 **/
exports.userGroupList = function(callback) {
    exports.getAccessTokenFromCache(function(err, accessToken) {
        if (err) return callback(err);
        var url = userGroupListUrl.replace('{ACCESS_TOKEN}', accessToken);
        httpHandle(url, 'GET', {}, {}, function(r) {
            if (callback) {
                callback(null, r);
            }
        });
    });
};


/**
 * 查询分组
 *
 * @param {string}    accessToken 调用接口凭证
 * @param {Object}    data 用户封装信息 {"openid":"od8XIjsmk6QdVTETa9jLtGWA6KBc"}
 * @param {function}  callback err,data
 * @returns void
 * @date
 * @author
 **/
// exports.getUserGroup = function(data, callback) {
//     exports.getAccessTokenFromCache(function(err, accessToken) {
//         if (err) return callback(err);
//         var url = getUserGroupUrl.replace('{ACCESS_TOKEN}', accessToken);
//         httpHandle(url, 'POST', {}, data, function(r) {
//             if (callback) {
//                 callback(null, r);
//             }
//         });
//     });
// };
exports.getUserGroup = function(data, callback) {
    exports.getAccessTokenFromCache(function(err, accessToken) {
        if (err) return callback(err);
        var url = getUserGroupUrl.replace('{ACCESS_TOKEN}', accessToken);
        httpHandle(url, 'POST', {}, data, function(msg) {
            // 解析msg
            var errmsg = exports.processMsg(msg);
            if(errmsg) return callback(errmsg);
            callback(null, msg);
        });
    });
};


module.exports.weixin = weixin;